We use data on players from the 2010 World Cup. The data frame contains 595 observations on the following variables:

Variable Description
Player Player’s last name
Team Country
Position a factor (levels: Defender, Forward, Goalkeeper, Midfielder)
Time Time played in minutes
Shots Number of shots attempted
Passes Number of passes made
Tackles Number of tackles made
Saves Number of saves made

Load the tidyverse package

library(tidyverse)

Get the data:

fifa_link <- "https://raw.githubusercontent.com/reisanar/datasets/master/worldcup.csv"
fifa10 <- read_csv(fifa_link)

Learn about the nature of the data

glimpse(fifa10)
Observations: 595
Variables: 8
$ Player   <chr> "Abdoun", "Abe", "Abidal", "Abou Diaby", "Aboubakar", "Abreu", "Addy", "Adiyi…
$ Team     <chr> "Algeria", "Japan", "France", "France", "Cameroon", "Uruguay", "Ghana", "Ghan…
$ Position <chr> "Midfielder", "Midfielder", "Defender", "Midfielder", "Forward", "Forward", "…
$ Time     <dbl> 16, 351, 180, 270, 46, 72, 138, 33, 21, 103, 270, 55, 106, 270, 390, 90, 136,…
$ Shots    <dbl> 0, 0, 0, 1, 2, 0, 0, 0, 5, 0, 2, 0, 2, 1, 1, 1, 5, 9, 0, 1, 0, 1, 7, 4, 1, 0,…
$ Passes   <dbl> 6, 101, 91, 111, 16, 15, 51, 9, 22, 38, 120, 31, 57, 123, 172, 59, 42, 465, 3…
$ Tackles  <dbl> 0, 14, 6, 5, 0, 0, 2, 0, 0, 1, 10, 2, 2, 11, 13, 7, 3, 18, 0, 1, 1, 0, 1, 11,…
$ Saves    <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…

Scatterplot

To understand the relationship between the number of passes and the number of tackles, let us use a scatter plot with Tackles in the horizontal axis, and Passes in the vertical axis. Color the points by Position

ggplot(data = fifa10) + 
  geom_point(aes(x = Tackles, y = Passes, color = Position))

Challenge

We can also check the relationship between the number of minutes played in the tournament (in the horizontal axis) and the number of passes completed by the player (in the vertical axis). Color the points by Position

ggplot(data = fifa10) + 
  geom_point(aes(x = Time, y = Passes, color = Position))

Challenge

fifa10 %>% 
  filter(Time > 400, Passes > 300, Position == 'Forward')

We can even add the variable Shots to the previous plot and plot the points based on the number of shots per player. Use the option size=Shots in the aesthetics.

ggplot(data = fifa10) + 
  geom_point(aes(x = Time, y = Passes, 
                 color = Position, size = Shots), 
             alpha = 0.5)

Challenge

Interactive Plots with plotly

We can use the plotly to convert ggplot objects into interactive plots in a very easy way!

library(plotly)

Let us recreate one of the plots studied before:

my_fifa_plot <- ggplot(data = fifa10) + 
  geom_point(aes(x = Time, y = Passes, color = Position, size = Shots), 
             alpha = 0.5)

Using the ggplotly() function, we can add interactivity powered by plotly

ggplotly(my_fifa_plot)

Notice that the interactive plot is also available in the .html output generated from this notebook!

To get you started, other examples can be found below: https://www.r-graph-gallery.com/interactive-charts.html

LS0tCnRpdGxlOiAiSW50ZXJhY3RpY2UgVmlzdWFsaXphdGlvbiAtIEEgcXVpY2sgZXhhbXBsZSIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKV2UgdXNlIGRhdGEgb24gcGxheWVycyBmcm9tIHRoZSAyMDEwIFdvcmxkIEN1cC4gVGhlIGRhdGEgZnJhbWUgY29udGFpbnMgNTk1IG9ic2VydmF0aW9ucyBvbiB0aGUgZm9sbG93aW5nIHZhcmlhYmxlczoKClZhcmlhYmxlICAgICAgfCBEZXNjcmlwdGlvbgotLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KYFBsYXllcmAgICAgICB8IFBsYXllcidzIGxhc3QgbmFtZQpgVGVhbWAgICAgICAgIHwgQ291bnRyeQpgUG9zaXRpb25gICAgIHwgYSBmYWN0b3IgKGxldmVsczogYERlZmVuZGVyYCwgYEZvcndhcmRgLCBgR29hbGtlZXBlcmAsIGBNaWRmaWVsZGVyYCkKYFRpbWVgICAgICAgICB8IFRpbWUgcGxheWVkIGluIG1pbnV0ZXMKYFNob3RzYCAgICAgICB8IE51bWJlciBvZiBzaG90cyBhdHRlbXB0ZWQKYFBhc3Nlc2AgICAgICB8IE51bWJlciBvZiBwYXNzZXMgbWFkZQpgVGFja2xlc2AgICAgIHwgTnVtYmVyIG9mIHRhY2tsZXMgbWFkZQpgU2F2ZXNgICAgICAgIHwgTnVtYmVyIG9mIHNhdmVzIG1hZGUKCgpMb2FkIHRoZSBgdGlkeXZlcnNlYCBwYWNrYWdlCgpgYGB7ciwgbWVzc2FnZT1GQUxTRX0KbGlicmFyeSh0aWR5dmVyc2UpCmBgYAoKR2V0IHRoZSBkYXRhOgoKYGBge3IsIG1lc3NhZ2U9RkFMU0V9CmZpZmFfbGluayA8LSAiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3JlaXNhbmFyL2RhdGFzZXRzL21hc3Rlci93b3JsZGN1cC5jc3YiCmZpZmExMCA8LSByZWFkX2NzdihmaWZhX2xpbmspCmBgYAoKTGVhcm4gYWJvdXQgdGhlIG5hdHVyZSBvZiB0aGUgZGF0YQoKYGBge3J9CmdsaW1wc2UoZmlmYTEwKQpgYGAKCgoKCgojIyBTY2F0dGVycGxvdAoKVG8gdW5kZXJzdGFuZCB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIG51bWJlciBvZiBwYXNzZXMgYW5kIHRoZSBudW1iZXIgb2YgdGFja2xlcywgbGV0IHVzIHVzZSBhIF9zY2F0dGVyIHBsb3RfIHdpdGggYFRhY2tsZXNgIGluIHRoZSBob3Jpem9udGFsIGF4aXMsIGFuZCBgUGFzc2VzYCBpbiB0aGUgdmVydGljYWwgYXhpcy4gQ29sb3IgdGhlIHBvaW50cyBieSBgUG9zaXRpb25gCgpgYGB7cn0KZ2dwbG90KGRhdGEgPSBmaWZhMTApICsgCiAgZ2VvbV9wb2ludChhZXMoeCA9IFRhY2tsZXMsIHkgPSBQYXNzZXMsIGNvbG9yID0gUG9zaXRpb24pKQpgYGAKCioqQ2hhbGxlbmdlKioKCi0gRG8geW91IG5vdGljZSBhbnl0aGluZyBpbiBwYXJ0aWN1bGFyIGFib3V0IHRob3NlIHBsYXllcnMgaW4gYEdvYWxrZWVwZXJgIGFuZCBgRm9yd2FyZGAgcG9zaXRpb25zPwoKCgpXZSBjYW4gYWxzbyBjaGVjayB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIG51bWJlciBvZiBtaW51dGVzIHBsYXllZCBpbiB0aGUgdG91cm5hbWVudCAoaW4gdGhlIGhvcml6b250YWwgYXhpcykgYW5kIHRoZSBudW1iZXIgb2YgcGFzc2VzIGNvbXBsZXRlZCBieSB0aGUgcGxheWVyIChpbiB0aGUgdmVydGljYWwgYXhpcykuIENvbG9yIHRoZSBwb2ludHMgYnkgYFBvc2l0aW9uYAoKYGBge3J9CmdncGxvdChkYXRhID0gZmlmYTEwKSArIAogIGdlb21fcG9pbnQoYWVzKHggPSBUaW1lLCB5ID0gUGFzc2VzLCBjb2xvciA9IFBvc2l0aW9uKSkKCmBgYAoKKipDaGFsbGVuZ2UqKgoKLSBEbyB5b3Ugbm90aWNlIGFueSBwYXJ0aWN1bGFyIF9zdHJ1Y3R1cmUvcGF0dGVybl8gaW4gdGhlIGdyYXBoIGFib3ZlPwoKYGBge3J9CmZpZmExMCAlPiUgCiAgZmlsdGVyKFRpbWUgPiA0MDAsIFBhc3NlcyA+IDMwMCwgUG9zaXRpb24gPT0gJ0ZvcndhcmQnKQpgYGAKCgoKV2UgY2FuIGV2ZW4gYWRkIHRoZSB2YXJpYWJsZSBgU2hvdHNgIHRvIHRoZSBwcmV2aW91cyBwbG90IGFuZCBwbG90IHRoZSBwb2ludHMgYmFzZWQgb24gdGhlIG51bWJlciBvZiBzaG90cyBwZXIgcGxheWVyLiBVc2UgdGhlIG9wdGlvbiBgc2l6ZT1TaG90c2AgaW4gdGhlIGFlc3RoZXRpY3MuIAoKYGBge3J9CmdncGxvdChkYXRhID0gZmlmYTEwKSArIAogIGdlb21fcG9pbnQoYWVzKHggPSBUaW1lLCB5ID0gUGFzc2VzLCAKICAgICAgICAgICAgICAgICBjb2xvciA9IFBvc2l0aW9uLCBzaXplID0gU2hvdHMpLCAKICAgICAgICAgICAgIGFscGhhID0gMC41KQoKYGBgCgoqKkNoYWxsZW5nZSoqCgotIENhbiB5b3UgZmluZCB0aGUgbmFtZSBvZiBhbnkgX291dHN0YW5kaW5nXyBwbGF5ZXJzIGJhc2VkIG9uIHRoZSBncmFwaCBhYm92ZT8gCgoKCgojIyBJbnRlcmFjdGl2ZSBQbG90cyB3aXRoIHBsb3RseQoKV2UgY2FuIHVzZSB0aGUgYHBsb3RseWAgdG8gY29udmVydCBgZ2dwbG90YCBvYmplY3RzIGludG8gaW50ZXJhY3RpdmUgcGxvdHMgaW4gYSB2ZXJ5IGVhc3kgd2F5IQoKYGBge3IsIG1lc3NhZ2U9RkFMU0V9CmxpYnJhcnkocGxvdGx5KQpgYGAKCkxldCB1cyByZWNyZWF0ZSBvbmUgb2YgdGhlIHBsb3RzIHN0dWRpZWQgYmVmb3JlOgoKYGBge3J9Cm15X2ZpZmFfcGxvdCA8LSBnZ3Bsb3QoZGF0YSA9IGZpZmExMCkgKyAKICBnZW9tX3BvaW50KGFlcyh4ID0gVGltZSwgeSA9IFBhc3NlcywgY29sb3IgPSBQb3NpdGlvbiwgc2l6ZSA9IFNob3RzKSwgCiAgICAgICAgICAgICBhbHBoYSA9IDAuNSkKYGBgCgoKVXNpbmcgdGhlIGBnZ3Bsb3RseSgpYCBmdW5jdGlvbiwgd2UgY2FuIGFkZCBpbnRlcmFjdGl2aXR5IHBvd2VyZWQgYnkgW3Bsb3RseV0oaHR0cHM6Ly9wbG90Lmx5LykKCmBgYHtyfQpnZ3Bsb3RseShteV9maWZhX3Bsb3QpCmBgYAoKTm90aWNlIHRoYXQgdGhlIGludGVyYWN0aXZlIHBsb3QgaXMgYWxzbyBhdmFpbGFibGUgaW4gdGhlIGAuaHRtbGAgb3V0cHV0IGdlbmVyYXRlZCBmcm9tIHRoaXMgbm90ZWJvb2shCgpUbyBnZXQgeW91IHN0YXJ0ZWQsIG90aGVyIGV4YW1wbGVzIGNhbiBiZSBmb3VuZCBiZWxvdzoKPGh0dHBzOi8vd3d3LnItZ3JhcGgtZ2FsbGVyeS5jb20vaW50ZXJhY3RpdmUtY2hhcnRzLmh0bWw+Cgo=